<?php

namespace ProjetA\GroupeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use ProjetA\GroupeBundle\Entity\Groupe;
use ProjetA\GroupeBundle\Entity\Post;
use ProjetA\GroupeBundle\Entity\Donnee;
use ProjetA\GroupeBundle\Form\GroupeType;
use ProjetA\GroupeBundle\Form\GroupeHandler;
use ProjetA\GroupeBundle\Form\GroupeEditHandler;
use ProjetA\GroupeBundle\Form\GroupeEtapeType;
use ProjetA\GroupeBundle\Form\RechercheGroupeType;
use ProjetA\GroupeBundle\Entity\Parametre as Parametre;
use ProjetA\GroupeBundle\Form\ParametreType as ParametreType;
use ProjetA\GroupeBundle\Entity\Type as Type;
use ProjetA\GroupeBundle\Entity\Page as Page;
use ProjetA\GroupeBundle\Entity\Text as Text;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use ProjetA\GroupeBundle\Form\PageGroupeType;
use FOS\UserBundle\Model\UserInterface;
use Pagerfanta\Adapter\DoctrineORMAdapter as DoctrineORMAdapter;
use Pagerfanta\Pagerfanta as Pagerfanta;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

/**
 * Groupe controller.
 *
 */
class GroupeController extends Controller {

    /**
     * Lists all Groupe entities.
     *
     */
    public function indexAction($page) {


        $qb = $this->getDoctrine()->getEntityManager()->createQueryBuilder()
                ->select('groupe')
                ->from('ProjetA\GroupeBundle\Entity\Groupe', 'groupe')
        ;

        // Classe spécifique à Doctrine, il existe un équivalent pour Propel.
        // Prend le QueryBuilder de notre requête en paramètre de son constructeur.
        $adapter = new DoctrineORMAdapter($qb);
        $pagerfanta = new Pagerfanta($adapter);
        // Le nombre maximum d'éléments par page
        $pagerfanta->setMaxPerPage(10);
        // Notre position actuelle (numéro de page)
        $pagerfanta->setCurrentPage($page);
        // On récupère nos entités via Pagerfanta,
        // celui-ci s'occupe de limiter la requête en fonction de nos réglages.
        $entities = $pagerfanta->getCurrentPageResults();

        /*
          $em = $this->getDoctrine()->getEntityManager();

          $entities = $em->getRepository('ProjetAGroupeBundle:Groupe')->findAll();
         */
        return $this->render('ProjetAGroupeBundle:Groupe:index.html.twig', array(
                    'entities' => $entities,
                    'pager' => $pagerfanta,
                    'rechercheRealisee' => "",
                ));
    }

    /**
     * Finds and displays a Groupe entity.
     *
     */
    public function showAction($id) {
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }
        /*
          $page = $entity->getPage();
          $entity = array();
          foreach ($page->getAttributs() as $attribut) {
          foreach ($entity->getTexts() as $text) {
          if($text->getName()== $attribut->getLibelle()){
          array_merge(array($attribut->getLibelle()), $entity);
          }
          }

          } */

        $deleteForm = $this->createDeleteForm($id);

        return $this->render('ProjetAGroupeBundle:Groupe:show.html.twig', array(
                    'entity' => $entity,
                    'delete_form' => $deleteForm->createView(),
                ));
    }

    /**
     * Displays a form to create a new Groupe entity.
     *
     * 
     * Mettre en paramètre : $idtype + l'ajouter dans twig
     */
    public function newAction($page) {
        $entity = new Groupe();
        $em = $this->getDoctrine()->getEntityManager();
        $page = $em->getRepository('ProjetAGroupeBundle:Page')->find($page);
        $user = $this->container->get('security.context')->getToken()->getUser();
        $form = $this->createForm(new GroupeType($page, $user->getUsername()), $entity);

        return $this->render('ProjetAGroupeBundle:Groupe:new.html.twig', array(
                    'entity' => $entity,
                    'form' => $form->createView(),
                    'page' => $page,
                ));
    }

    public function new1Action() {
        $entity = new Groupe();
        $form = $this->createForm(new GroupeEtapeType(), $entity);

        return $this->render('ProjetAGroupeBundle:Groupe:new1.html.twig', array(
                    'entity' => $entity,
                    'form' => $form->createView(),
                ));
    }

    public function suivantAction() {

        $entity = new Groupe();
        $request = $this->getRequest();
        $form = $this->createForm(new GroupeEtapeType(), $entity);
        $form->bindRequest($request);

        if ($form->isValid()) {
            $type = $form["page"]->getData();
            return $this->redirect($this->generateUrl('groupe_new', array('page' => $type->getId())));
        }

        return $this->render('ProjetAGroupeBundle:Groupe:new1.html.twig', array(
                    'entity' => $entity,
                    'form' => $form->createView(),
                ));
    }

    /**
     * Creates a new Groupe entity.
     *
     */
    public function createAction() {

        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $postData = $request->request->all();
        /*
          $type_id = $dataform['groupe_type'];

          $attributs = $type->getAttributs();
          $param = new Parametre($attributs,$type_id, $dataform);

          $form = $this->createForm(new ParametreType(),$param);
         */


        $dataform = $postData['projeta_groupebundle_groupetype'];
        $page_id = $dataform['page_id'];
        $page = $em->getRepository('ProjetAGroupeBundle:Page')->find($page_id);
        $entity = new Groupe();
        $user = $this->container->get('security.context')->getToken()->getUser();
        $form = $this->createForm(new GroupeType($page, $user->getUsername()), $entity);
        $userManager = $this->get('fos_user.user_manager');



        $formHandler = new GroupeHandler($form, $this->get('request'), $this->getDoctrine()->getEntityManager(), $userManager);
        $groupe_id = $formHandler->process();
        if ($groupe_id) {
            return $this->redirect($this->generateUrl('groupe_show', array('id' => $groupe_id)));
        }
        return $this->render('ProjetAGroupeBundle:Groupe:new.html.twig', array(
                    'type' => $page_id,
                    'entity' => $entity,
                    'form2' => $form->createView()
                ));





        /*

          $param = new Parametre($attributs,$type_id, $dataform);

          $form = $this->createForm(new ParametreType(),$param);
          if ($request->getMethod() == 'POST') {

          $form->bindRequest($request);

          if ($form->isValid()) {
          $dataparam = $param->get();
          $gr = new Groupe();
          $gr->setDatecreation(date());
          $gr->setNom($dataform['groupe_nom']);
          $gr->setDescription($dataform['groupe_description']);
          $gr->setPublic($dataform['groupe_public']);
          $gr->setType($type);

          foreach ($dataparam as $k => $value) {
          if ($value['id']) {
          $d = new Donnee();
          $d->setValeur($value['value']);
          $att = $em->getRepository('ProjetAGroupeBundle:Attribut')->find($value['id']);
          $d->setAttribut($att);
          $em->persist($d);
          $gr->addDonnee($d);
          }
          }

          $em->persist($gr);
          $em->flush();

          return $this->redirect($this->generateUrl('groupe_show', array('id' => $gr->getId())));
          }
          }
          return $this->render('ProjetAGroupeBundle:Groupe:new.html.twig', array(
          'entity' => $gr,
          'type' => $type_id,
          'form' => $form->createView()
          )); */
    }

    /**
     * Recherche d'un nom de groupe.
     */
    public function rechercheAction($page) {

        $request = $this->container->get('request');
        $recherche = $request->request->get('recherche');

        $em = $this->container->get('doctrine')->getEntityManager();
        $qb = $em->createQueryBuilder();
        $qb->select('g')
                ->from('ProjetAGroupeBundle:Groupe', 'g')
                ->where("g.nom LIKE :motcle")
                ->setParameter('motcle', '%' . $recherche . '%');

//        $query = $qb->getQuery();
//        $groupes = $query->getResult();
        // Classe spécifique à Doctrine, il existe un équivalent pour Propel.
        // Prend le QueryBuilder de notre requête en paramètre de son constructeur.
        $adapter = new DoctrineORMAdapter($qb);
        $pagerfanta = new Pagerfanta($adapter);
        // Le nombre maximum d'éléments par page
        $pagerfanta->setMaxPerPage(10);
        // Notre position actuelle (numéro de page)
        $pagerfanta->setCurrentPage($page);
        // On récupère nos entités via Pagerfanta,
        // celui-ci s'occupe de limiter la requête en fonction de nos réglages.
        $entities = $pagerfanta->getCurrentPageResults();

        return $this->render('ProjetAGroupeBundle:Groupe:index.html.twig', array(
                    'entities' => $entities,
                    'pager' => $pagerfanta,
                    'rechercheRealisee' => $recherche,
                ));
    }

    /**
     * Displays a form to edit an existing Groupe entity.
     *
     */
    public function editAction($id) {
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }

        $editForm = $this->createForm(new GroupeType($entity->getPage(), $entity->getModerateur()->getUsername(), $entity), $entity);
        $deleteForm = $this->createDeleteForm($id);

        return $this->render('ProjetAGroupeBundle:Groupe:edit.html.twig', array(
                    'entity' => $entity,
                    'edit_form' => $editForm->createView(),
                    'delete_form' => $deleteForm->createView(),
                ));
    }

    /**
     * Edits an existing Groupe entity.
     *
     */
    public function updateAction($id) {

        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $postData = $request->request->all();

        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

        $form = $this->createForm(new GroupeType($entity->getPage(), $entity->getModerateur()->getUsername()),$entity);




        $formHandler = new GroupeEditHandler($form, $this->get('request'), $this->getDoctrine()->getEntityManager(),$entity);
        $groupe_id = $formHandler->process();
        if ($groupe_id) {
            return $this->redirect($this->generateUrl('groupe_show', array('id' => $groupe_id)));
        }
        return $this->render('ProjetAGroupeBundle:Groupe:edit.html.twig', array(
                    'type' => $page_id,
                    'entity' => $entity,
                    'form2' => $form->createView()
                ));





        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }

        $editForm = $this->createForm(new GroupeType(), $entity);
        $deleteForm = $this->createDeleteForm($id);

        $request = $this->getRequest();

        $editForm->bindRequest($request);

        if ($editForm->isValid()) {
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('groupe_edit', array('id' => $id)));
        }

        return $this->render('ProjetAGroupeBundle:Groupe:edit.html.twig', array(
                    'entity' => $entity,
                    'edit_form' => $editForm->createView(),
                    'delete_form' => $deleteForm->createView(),
                ));
    }

    /**
     * Deletes a Groupe entity.
     *
     */
    public function deleteAction($id) {
        $form = $this->createDeleteForm($id);
        $request = $this->getRequest();

        $form->bindRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

            if (!$entity) {
                throw $this->createNotFoundException('Unable to find Groupe entity.');
            }
            
            $entity->getDemandeurs()->clear();
            $entity->getInscrits()->clear();
            $em->remove($entity);
            $em->flush();
        }

        return $this->redirect($this->generateUrl('groupe'));
    }

    private function createDeleteForm($id) {
        return $this->createFormBuilder(array('id' => $id))
                        ->add('id', 'hidden')
                        ->getForm()
        ;
    }

    /*
     * publier un commentaire dans un groupe
     */

    public function commenterAction() {
        $user = $this->container->get('security.context')->getToken()->getUser();
        // Et pour vérifier que l'utilisateur est authentifié (et non un anonyme)
        if (!is_object($user)) {
            throw new AccessDeniedException('Vous n\'êtes pas authentifié.');
        }

        $request = $this->getRequest();
        $post = $request->request->get('commentaire');
        $id = $request->request->get('id');

        $em = $this->getDoctrine()->getEntityManager();
        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);
        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }

        $postentity = new Post();
        $postentity->setPost($post);
        $postentity->setGroupe($entity);
        $today = new \DateTime("now");
        $postentity->setDateCreation($today);
        $postentity->setUser($user);

        $entity->addPost($postentity);
        $em->persist($entity);
        $em->persist($postentity);
        $em->flush();

        return $this->redirect($this->generateUrl('groupe_show', array('id' => $entity->getId())));
    }

    /*
     * suppression des commentaires par le modérateur d'un groupe.
     * a l'aide d'une checkbox
     */

    public function suppcommentaireAction() {
        $request = $this->container->get('request');
        $suppcomm = $request->request->get('supp_comm');
        $id = $request->request->get('id');
        $em = $this->getDoctrine()->getEntityManager();
        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

        for ($i = 0; $i < count($suppcomm); $i++) {
            $post = $em->getRepository('ProjetAGroupeBundle:Post')->find($suppcomm[$i]);
            $entity->suppPost($post);
            $em->remove($post);
        }
        $this->get('session')->setFlash('message', 'moderateur.user.suppr');
        $em->flush();

        return $this->redirect($this->generateUrl('groupe_show', array('id' => $entity->getId())));
    }

    /*
     * Inscription 
     */

    public function inscriptionAction($id) {

        $em = $this->getDoctrine()->getEntityManager();
        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }

        $user = $this->container->get('security.context')->getToken()->getUser();
        // Et pour vérifier que l'utilisateur est authentifié (et non un anonyme)
        if (!is_object($user)) {
            throw new AccessDeniedException('Vous n\'êtes pas authentifié.');
        }

        $user->addInscritGroupe($entity);
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('groupe_show', array('id' => $entity->getId())));
    }

    public function desinscriptionAction($id) {

        $em = $this->getDoctrine()->getEntityManager();
        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }

        $user = $this->container->get('security.context')->getToken()->getUser();
        // Et pour vérifier que l'utilisateur est authentifié (et non un anonyme)
        if (!is_object($user)) {
            throw new AccessDeniedException('Vous n\'êtes pas authentifié.');
        }

        $user->suppInscritGroupe($entity);
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('groupe_show', array('id' => $entity->getId())));
    }

    public function retirerAction($id, $username) {

        $em = $this->getDoctrine()->getEntityManager();
        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);
        $userManager = $this->get('fos_user.user_manager');
        $user = $userManager->findUserBy(array('username' => $username));
        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }
        if (!is_object($user)) {
            throw new AccessDeniedException('Ce n\'est pas un uilisateur.');
        }
        $user->suppInscritGroupe($entity);
        $em->persist($entity);
        $em->flush();

        $this->get('session')->setFlash('message', 'moderateur.user.retirer');
        return $this->redirect($this->generateUrl('groupe_show', array('id' => $entity->getId())));
    }

    public function annulerAction($id) {
        $em = $this->getDoctrine()->getEntityManager();
        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }
        $user = $this->container->get('security.context')->getToken()->getUser();
        // Et pour vérifier que l'utilisateur est authentifié (et non un anonyme)
        if (!is_object($user)) {
            throw new AccessDeniedException('Vous n\'êtes pas authentifié.');
        }
        $user->suppDemandeGroupe($entity);
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('groupe_show', array('id' => $entity->getId())));
    }

    public function refuserAction($id, $user) {
        $em = $this->getDoctrine()->getEntityManager();
        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }
        $userManager = $this->get('fos_user.user_manager');
        // Pour charger un utilisateur
        $user = $userManager->findUserBy(array('username' => $user));

        $user->suppDemandeGroupe($entity);
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('groupe_show', array('id' => $entity->getId())));
    }

    public function accepterAction($id, $user) {
        $em = $this->getDoctrine()->getEntityManager();
        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }

        $userManager = $this->get('fos_user.user_manager');
        // Pour charger un utilisateur
        $user = $userManager->findUserBy(array('username' => $user));

        $user->suppDemandeGroupe($entity);
        $user->addInscritGroupe($entity);
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('groupe_show', array('id' => $entity->getId())));
    }

    public function demandeAction($id) {

        $em = $this->getDoctrine()->getEntityManager();
        $entity = $em->getRepository('ProjetAGroupeBundle:Groupe')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find Groupe entity.');
        }

        $user = $this->container->get('security.context')->getToken()->getUser();
        // Et pour vérifier que l'utilisateur est authentifié (et non un anonyme)
        if (!is_object($user)) {
            throw new AccessDeniedException('Vous n\'êtes pas authentifié.');
        }

        $user->addDemandeGroupe($entity);
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('groupe_show', array('id' => $entity->getId())));
    }

}
